home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- /* tables to define S boxes and P, per NBS */
-
- static int s_table [8] [4] [16] =
- { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
- 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
- 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
- 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
-
- 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
- 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
- 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
- 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
-
- 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
- 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
- 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
- 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
-
- 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
- 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
- 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
- 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
-
- 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
- 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
- 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
- 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
-
- 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
- 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
- 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
- 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
-
- 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
- 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
- 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
- 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
-
- 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
- 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
- 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
- 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };
-
- static int ptab [32] =
- { 16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25 };
-
- /* --- following is code to compute and store optimized tables --- */
- /*
-
- The ip, ipi, and ipis tables, their use and generation...
-
- The IP table is used to perform the IP operations of DES
- efficiently, on a byte-by-byte basis. There are 256 entries,
- each of which is 64 bits wide. Each 64 bit entry is composed of
- two longs, and the [0]'th long contains the high order bits.) To
- do the IP transformation, one starts by extracting the rightmost
- byte from the block to be encrypted, and looking up the
- corresponding table entry. Proceed by shifting the accumulated
- partial IP left one place and inclusive-OR'ing the table value
- for each more significant byte. Continue until all bytes
- have been processed.
-
- Regrettably, the structure of the IP-inverse operation is not
- such as to allow table lookup based on bytes selected in
- left-to-right (or right-to-left) order. To compensate for this
- fact, the ipis table is supplied. As one advances through the
- entries in ipis, one finds indexes which select the input byte
- (from 1-8, going left to right) whose value should be used to
- select the next entry in ipi. If this reordering is followed, the
- entries extracted from ipi can be inclusive-OR'd and left shifted
- (in the same manner described for ip), to perform the ip-inverse
- transformation.
-
- */
-
- static long ip [2] [256];
- static long ipi [2] [256];
- static int ipis [8] = {5, 1, 6, 2, 7, 3, 8, 4};
-
- /* setipent -- given a byte value, compute the corresponding
- entry and store it in the ip table. Computation based on
- embedded knowledge of DES algorithm structure. */
-
- setipent (val)
- int val;
- {
- extern long ip [2] [256];
-
- ip [0] [val] = ip [1] [val] = 0L;
-
- if (val & 0X40) ip [0] [val] |= 0X1000000L;
- if (val & 0X10) ip [0] [val] |= 0X10000L;
- if (val & 0X4) ip [0] [val] |= 0X100L;
- if (val & 0X1) ip [0] [val] |= 0X1L;
- if (val & 0X80) ip [1] [val] |= 0X1000000L;
- if (val & 0X20) ip [1] [val] |= 0X10000L;
- if (val & 0X8) ip [1] [val] |= 0X100L;
- if (val & 0X2) ip [1] [val] |= 0X1L;
- }
-
- /* setipient -- given a byte value, compute the corresponding
- entry and store it in the ipi table. Computation based on
- embedded knowledge of DES algorithm structure. */
-
- setipient (val)
- int val;
- {
- extern long ipi [2] [256];
-
- ipi [0] [val] = ipi [1] [val] = 0L;
-
- if (val & 0X1) ipi [0] [val] |= 0X1000000L;
- if (val & 0X2) ipi [0] [val] |= 0X10000L;
- if (val & 0X4) ipi [0] [val] |= 0X100L;
- if (val & 0X8) ipi [0] [val] |= 0X1L;
- if (val & 0X10) ipi [1] [val] |= 0X1000000L;
- if (val & 0X20) ipi [1] [val] |= 0X10000L;
- if (val & 0X40) ipi [1] [val] |= 0X100L;
- if (val & 0X80) ipi [1] [val] |= 0X1L;
- }
-
- /* setip -- initialize ip and ipi tables */
- setip ()
- {
- int i;
-
- for (i = 0; i < 256; i++)
- {
- setipent (i);
- setipient (i);
- }
- }
-
-
- /*
-
- the snop table... its generation and use
-
- Structure snop is a two-dimensional array. The high-order
- dimension corresponds to 1 of 8 input bytes, each in the format
- produced by skedkeys and the E implementation (each byte has 6
- significant bits, left-justified in an 8-bit byte, and the input
- stream of bytes appears in 4 words as (1 3) (5 7) (2 4) (6 8).
- As the dimension varies from 0->7, bytes are selected from this
- ordering from left to right.
-
- Using a series of 8 table lookups in snop (one for each byte),
- and IOR'ing the corresponding 32-bit entries, the caller can
- assemble the composition of s-box lookup and P permutation as
- specified in DES. In a table entry corresponding to a particular
- byte, only those bits are set which correspond to those selected
- by P for the particular s-box.
-
- The current format for snop has 64, not 256 entries per byte
- position. Therefore, it is necessary to divide a byte's value by
- 4 before using it as a table index.
-
- setsnop () computes the entries in snop, based on the NBS tables.
-
- */
- static long snop [8] [64];
-
-
- setsnop ()
- {
- extern long snop [8] [64];
-
- static int map_to_e [8] = {0, 2, 4, 6, 1, 3, 5, 7};
- /* table used so that bytes ordered as produced by the
- E algorithm implementation can be looked up left-to-right */
-
- int i, j, ns, ni;
- int srow, scol;
-
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 64; j++) snop [i] [j] = 0L;
- }
-
- for (ns = 0; ns < 8; ns++) /* do for each of 8 S-boxes */
- {
- for (ni = 0; ni < 64; ni++) /* do each entry in each box */
- {
- srow = ((ni & 32) >> 4) | (ni & 01); /* lsb and msb of 6 bits */
- scol = (ni >> 1) & 0XF;
-
- /* now, do successive left shifts on a snop entry,
- IOR'ing in bits iff P selects a position from the S-box */
-
- for (i = 0; i < 32; i++) /* over each bit in the entry */
- {
- if (map_to_e[ns] != ((ptab [i] - 1) / 4))
- {
- /* this bit not from this S-box: leave alone */
- if (i != 31) snop [ns] [ni] <<= 1;
- continue;
- }
- else
- {
- snop [ns] [ni] |=
- (01 & (s_table [map_to_e[ns]] [srow] [scol] >>
- (3 - ((ptab [i] - 1) % 4))));
- if (i != 31) snop [ns] [ni] <<= 1;
- }
- }
- }
- }
-
- /*
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 64; j++)
- printf ("snop [%d] [%d] = %lx\n", i, j, snop [i] [j]);
- }
- */
-
- }
-
- /* main for tblbuild: compute and output ip, ipi, ipis, snop */
- main ()
- {
- extern long ip [2] [256];
- extern long ipi [2] [256];
- extern int ipis [8];
- extern long snop [8] [64];
-
- int i, j;
- FILE *fp, *fopen ();
-
- /* compute the static tables */
- printf ("Computing transformation tables...\n");
- setip ();
- setsnop ();
-
- if (NULL == (fp = fopen ("ip", "w")))
- {
- printf ("tblbuild -- can't open output file 'ip'\n");
- exit (1);
- }
- for (i = 0; i < 2; i++)
- for (j = 0; j < 256; j++) fprintf (fp, "%lx\n", ip [i] [j]);
- fclose (fp);
-
- if (NULL == (fp = fopen ("ipi", "w")))
- {
- printf ("tblbuild -- can't open output file 'ipi'\n");
- exit (1);
- }
- for (i = 0; i < 2; i++)
- for (j = 0; j < 256; j++) fprintf (fp, "%lx\n", ipi [i] [j]);
- fclose (fp);
-
- if (NULL == (fp = fopen ("ipis", "w")))
- {
- printf ("tblbuild -- can't open output file 'ipis'\n");
- exit (1);
- }
- for (i = 0; i < 8; i++) fprintf (fp, "%x\n", ipis [i]);
- fclose (fp);
-
- if (NULL == (fp = fopen ("snop", "w")))
- {
- printf ("tblbuild -- can't open output file 'snop'\n");
- exit (1);
- }
- for (i = 0; i < 8; i++)
- for (j = 0; j < 64; j++) fprintf (fp, "%lx\n", snop [i] [j]);
- fclose (fp);
-
- printf ("tblbuild -- table files output\n");
- }
-